package br.fic.poo.agenda.persistencia;

import br.fic.poo.agenda.classes.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class ContatoDAO
{
    private Agenda agenda;
    private ArrayList<Contato> contatos;
    
    public ContatoDAO()
    {
        agenda = Agenda.getAgenda();
        contatos = agenda.getListaContatos();
    }
    
    public void incluir(Contato contato) throws Exception
    {
        int maxId = 0;
        // verifica parâmetro
        if (contato == null)
            throw new Exception("Objeto Contato para incluir está nulo!");
        // verifica o nome vazio do contato
        if (contato.getNome().isEmpty())
            throw new Exception("Nome do Contato para incluir está vazio!");
        // identifica o último id existente
        if (contatos.size() > 0)
        {
            maxId = contatos.get(contatos.size()-1).getId();
        }
        contato.setId(maxId+1);
        contatos.add(contato);
    }

    // validar o objeto Contato (not null)
    public void alterar(Contato contato) throws Exception 
    {
        Contato c;
        Integer indice = -1;
        // pesquisa o índice do ID do Contato
        for(int i=0; i < contatos.size(); i++)
        {
            c = contatos.get(i);
            if (c.getId() == contato.getId().intValue())
            {
                indice = i;
                break;
            }
        }
        // atualiza o Contato com ID localizado
        if (indice > -1)
        {
            contatos.set(indice,contato);
        }
        else
            throw new Exception("Contato não localizado na Alteração solicitada "+
                    "("+contato.getId()+") !");
    }

    public void excluir(Integer id) throws Exception 
    {
        Contato c;
        Integer indice = -1;
        // pesquisa o índice do ID do Contato
        for(int i=0; i < contatos.size(); i++)
        {
            c = contatos.get(i);
            if (c.getId() == id.intValue())
            {
                indice = i;
                break;
            }
        }
        // exclui o Contato com ID localizado
        if (indice > -1)
        {
            contatos.remove(indice.intValue());
        }
        else
            throw new Exception("Contato não localizado na Exclusão solicitada "+
                    "("+id+") !");
  }

    public Contato consultar(Integer id) throws Exception 
    {
        for(Contato c : contatos)
        {
            if (c.getId() == id.intValue())
                return c;
        }
        throw new Exception("Contato não localizado na Consulta por ID "+
                    "("+id+") !");
    }

    public ArrayList<Contato> consultar(String nome) 
    {
        ArrayList<Contato> lista = new ArrayList();
        for(Contato c : contatos)
        {
            if (c.getNome().indexOf(nome) >= 0)
                lista.add(c);
        }
        Collections.sort(lista , 
                new Comparator<Contato>()
                {
                    public int compare(Contato c1, Contato c2)
                    {
                        return c1.getNome().compareTo(c2.getNome());
                }
        });
        return lista;
    }

    public ArrayList<Contato> consultar() 
    {
        ArrayList<Contato> lista = new ArrayList();
        //lista.addAll(contatos);
        for(Contato c : contatos)
            lista.add(c);

        Collections.sort(contatos);
       
        Collections.sort(lista , 
                new Comparator<Contato>()
                {
                    public int compare(Contato c1, Contato c2)
                    {
                        return c1.getNome().compareTo(c2.getNome());
                }
        });
        return lista;
    }

}


